"""
演示Python的闭包特性
1、不要轻易轻易全局变量，因为全局变量是不安全的，谁都可以修改其内容
2、使用闭包，内部函数可以使用外部变量
"""


# 简单闭包
# def outer(logo: str):
#     def inner(msg: str):
#         """
#         内部函数，也叫闭包函数
#         此时如果想要在闭包外部修改外部变量（logo）需要重新创建一个outer，相当于logo无法被外部修改，外部变量被锁定
#         :param msg:
#         :return:
#         """
#         print(f"<{logo}>{msg}</{logo}>")
#
#     return inner
#
#
# fn1 = outer("黑马程序员")
# print(type(fn1))
# fn1("大家好")
#
# fn2 = outer("传智教育")
# fn2("大家好")

# 在闭包中修改外部变量，使用nonlocal关键字
# def outer(num1):
#     def inner(num2):
#         """
#         内部函数，也叫闭包函数
#         通过nonlocal关键字修饰外部函数的变量，才能在内部函数中修改外部变量
#         :param num2:
#         :return:
#         """
#         nonlocal num1
#         num1 += num2
#         print(f"num1={num1}")
#
#     return inner
#
#
# fn = outer(10)
# fn(2)
# fn(3)
# fn(5)

# 使用闭包实现ATM案例(没有使用全局变量)
def account_create(initial_amount=0):
    print(f"创建账户，账户初始余额：{initial_amount}")

    def atm(num, deposit=True):
        """
        存取款闭包程序
        :param num: 存/取款金额
        :param deposit: 存款时传入True，取款时传入False，默认为True
        """
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"存款：{num}元，账户余额：{initial_amount}")
        else:
            initial_amount -= num
            print(f"取款：{num}元，账户余额：{initial_amount}")

    return atm


atm = account_create()
atm(300)
atm(300)
atm(100, False)
